#ifndef __FLOOR_FSM_H__
#define __FLOOR_FSM_H__

#include <stdint.h>

typedef uint8_t (*event_function)(uint16_t event);

typedef void (*fsm_func_init)();
typedef void (*fsm_func_run)();
typedef void (*fsm_func_exit)();


typedef struct fsm_table {
	uint16_t event;					//事件
	uint8_t cur_state;				//当前状态
	uint8_t next_state;				//下个状态
	event_function event_call;		//事件发生函数
}fsm_table_t;

typedef struct fsm_state_node {
	fsm_func_init init;				//init初始化
	fsm_func_run run;				//持续执行函数
	fsm_func_exit exit;				//退出执行的函数
//	void *pri_data;					//私有数据
}fsm_state_t;

typedef struct fsm_object {
	fsm_table_t *fsm_table;				//状态转移表
	uint16_t table_count;				//状态表长度
	uint8_t prev_state;					//历史状态
	uint8_t cur_state;					//当前状态
	uint8_t init_state;					//初始化状态
	
	// fsm_state_t *cur_state_ptr;			//当前指针
	// fsm_state_t *fsm_nodes;				//状态实例表
}fsm_object_t;


/**
 * 初始化有限状态机
 ***/
int fsm_init(fsm_object_t *fsm,int init,fsm_table_t *table,int table_count);

/**
 * event 事件执行
 ***/
int fsm_event_handle(fsm_object_t *fsm,int event);

/**
 * 状态转移
 ***/
void fsm_state_transfer(fsm_object_t *fsm,int state);

/**
 * 状态执行函数
 ***/
//int fsm_state_run(fsm_object_t *fsm);

#endif //__FLOOR_FSM_H__
